/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package scacp;

import java.awt.event.ActionEvent;
import javax.swing.JOptionPane;

/**
 *
 * @author cleber
 */
public class CartaoPainelGerencimento extends javax.swing.JPanel {

    Prova prova;

    /**
     * Creates new form CartaoPainelGerencimento
     */
    public CartaoPainelGerencimento() {
    }

    public CartaoPainelGerencimento(Prova prova) {
        this.prova = prova;
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        scrpnlQuestoesCartao = new javax.swing.JScrollPane();
        painelInternoScroll = new javax.swing.JPanel();
        pnlBotoesCartao = new javax.swing.JPanel();
        btnIncluir = new javax.swing.JButton();
        btnAlterar = new javax.swing.JButton();
        btnExcluir = new javax.swing.JButton();
        btnLocalizar = new javax.swing.JButton();
        btnCorrigirCartoes = new javax.swing.JButton();

        scrpnlQuestoesCartao.setMinimumSize(new java.awt.Dimension(100, 100));
        scrpnlQuestoesCartao.setPreferredSize(new java.awt.Dimension(400, 400));
        scrpnlQuestoesCartao.getHorizontalScrollBar().setUnitIncrement(10);
        scrpnlQuestoesCartao.getVerticalScrollBar().setUnitIncrement(10);

        painelInternoScroll.setAlignmentX(0.0F);
        painelInternoScroll.setAlignmentY(0.0F);
        painelInternoScroll.setPreferredSize(new java.awt.Dimension(100, 100));
        scrpnlQuestoesCartao.setViewportView(painelInternoScroll);

        pnlBotoesCartao.setBorder(javax.swing.BorderFactory.createTitledBorder("Opções de Cartão"));

        btnIncluir.setText("Incluir");
        btnIncluir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnIncluirActionPerformed(evt);
            }
        });

        btnAlterar.setText("Alterar");
        btnAlterar.setEnabled(false);
        btnAlterar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAlterarActionPerformed(evt);
            }
        });

        btnExcluir.setText("Excluir");
        btnExcluir.setEnabled(false);
        btnExcluir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnExcluirActionPerformed(evt);
            }
        });

        btnLocalizar.setText("Localizar");
        btnLocalizar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLocalizarActionPerformed(evt);
            }
        });

        btnCorrigirCartoes.setText("Corrigir Cartões");
        btnCorrigirCartoes.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnCorrigirCartoesActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout pnlBotoesCartaoLayout = new javax.swing.GroupLayout(pnlBotoesCartao);
        pnlBotoesCartao.setLayout(pnlBotoesCartaoLayout);
        pnlBotoesCartaoLayout.setHorizontalGroup(
            pnlBotoesCartaoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(pnlBotoesCartaoLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(btnIncluir)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(btnAlterar)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(btnExcluir)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(btnLocalizar)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 57, Short.MAX_VALUE)
                .addComponent(btnCorrigirCartoes)
                .addContainerGap())
        );
        pnlBotoesCartaoLayout.setVerticalGroup(
            pnlBotoesCartaoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(pnlBotoesCartaoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(btnIncluir)
                .addComponent(btnAlterar)
                .addComponent(btnExcluir)
                .addComponent(btnLocalizar)
                .addComponent(btnCorrigirCartoes))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(scrpnlQuestoesCartao, javax.swing.GroupLayout.DEFAULT_SIZE, 497, Short.MAX_VALUE)
                    .addComponent(pnlBotoesCartao, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(scrpnlQuestoesCartao, javax.swing.GroupLayout.DEFAULT_SIZE, 231, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(pnlBotoesCartao, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );
    }// </editor-fold>//GEN-END:initComponents

    private void btnIncluirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnIncluirActionPerformed
        int numeroInscricao;
        String numeroInscricaoString;
        Cartao novoCartao;
        CartaoPainel cartaoPainel;
        System.out.println("Número:" + GeradorDados.gerarNumeroInscricao());
        if (salvarCartaoAtual()) {
            try {
                numeroInscricaoString = JOptionPane.showInputDialog(this, "Informe o número de inscrição do candidato:", "Número de Inscrição", JOptionPane.OK_OPTION);
                if (numeroInscricaoString != null) {
                    numeroInscricao = Integer.parseInt(numeroInscricaoString);
                    if (Cartao.validarNumeroInscricao(numeroInscricao)) {
                        if (prova.getGabarito().equals("")) {
                            if (numeroInscricao != 9999990) {
                                JOptionPane.showMessageDialog(this, "O primeiro cartão a ser informado deve ser o gabarito!", "Primeiro cartão!", JOptionPane.OK_CANCEL_OPTION);
                                return;
                            } else {
                                JOptionPane.showMessageDialog(this, "Estas são as respostas do gabarito!\nCuidado para não informar as respostas erradas,\npois não será possível alterá-las posteriormente.", "Inserção do gabarito", JOptionPane.OK_CANCEL_OPTION);
                            }
                        } else if (numeroInscricao == 9999990) {
                            JOptionPane.showMessageDialog(this, "Este número de inscrição é do gabarito!\nNão é permitido inserir um cartão de prova com o mesmo número do gabarito!\nInforme outro número de inscrição!", "Número de inscrição do gabarito", JOptionPane.OK_CANCEL_OPTION);
                            return;
                        } else if (numeroInscricao == 0) {
                            resetarPainel();
                            JOptionPane.showMessageDialog(this, "Número de inscrição do último cartão informado!\nClique para corrigir as provas.", "Último cartão!", JOptionPane.OK_CANCEL_OPTION);
                            btnIncluir.setEnabled(false);
                            btnExcluir.setEnabled(false);
                            btnLocalizar.setEnabled(false);
                            btnAlterar.setEnabled(false);
                            btnCorrigirCartoes.setEnabled(true);
                            return;
                        } else if (prova.getCartoes().containsKey(numeroInscricao)) {
                            JOptionPane.showMessageDialog(this, "Este número de inscrição já foi informado!\nNão é permitido haver dois cartões de prova com o mesmo número!\nInforme outro número de inscrição!", "Número de inscrição existente", JOptionPane.OK_CANCEL_OPTION);
                            return;
                        }
                        novoCartao = new Cartao(numeroInscricao);
                        cartaoPainel = new CartaoPainel(novoCartao, prova.getQuantidadeQuestoes(), prova.getTipoProva());
                        //cartaoPainel.setPreferredSize(new Dimension(cartaoPainel.getPreferredSize().width+30, cartaoPainel.getPreferredSize().height));
                        btnIncluir.setEnabled(true);
                        btnExcluir.setEnabled(true);
                        btnLocalizar.setEnabled(true);
                        btnAlterar.setEnabled(false);
                        btnCorrigirCartoes.setEnabled(false);
                        resetarPainel();
                        painelInternoScroll.add(cartaoPainel);
                        painelInternoScroll.setPreferredSize(cartaoPainel.getPreferredSize());
                        painelInternoScroll.validate();
                        painelInternoScroll.repaint();
                        scrpnlQuestoesCartao.validate();
                        scrpnlQuestoesCartao.repaint();
                    } else {
                        JOptionPane.showMessageDialog(this, "Número de inscrição inválido!\nInforme um número válido!", "Inscrição Inválida", JOptionPane.ERROR_MESSAGE);
                    }
                } else {
                    resetarPainel();
                }
            } catch (NumberFormatException excecao) {
                JOptionPane.showMessageDialog(this, "Número de inscrição inválido!\nInforme um número válido!", "Inscrição Inválida", JOptionPane.ERROR_MESSAGE);
            }
        }
    }//GEN-LAST:event_btnIncluirActionPerformed

    private void btnAlterarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAlterarActionPerformed
        if (painelInternoScroll.getComponentCount() != 0) {
            ((CartaoPainel) painelInternoScroll.getComponent(0)).setEnabled(true);
            ((CartaoPainel) painelInternoScroll.getComponent(0)).getCartao().setCartaoSalvo(false);
            btnExcluir.setEnabled(true);
            btnAlterar.setEnabled(false);
        }
    }//GEN-LAST:event_btnAlterarActionPerformed

    private void btnExcluirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnExcluirActionPerformed
        int opcao;
        
        Cartao cartao = ((CartaoPainel) painelInternoScroll.getComponent(0)).getCartao();
        
        opcao = JOptionPane.showConfirmDialog(this, "Deseja de fato excluir o cartão (" + cartao.getNumeroInscricao() + ")?", "Excluir cartão", JOptionPane.INFORMATION_MESSAGE);

        switch (opcao) {
            case 0: // "Ok" option
                CartaoDAO cartaoDAO = new CartaoDAO();
                if(cartaoDAO.cartaoJaExiste(cartao.getNumeroInscricao(), prova.getIdProva())){
                    cartaoDAO.excluirCartao(cartao.getNumeroInscricao(), prova.getIdProva());
                }
                if(prova.getCartoes().containsKey(cartao.getNumeroInscricao())){
                    prova.getCartoes().remove(cartao.getNumeroInscricao());
                }
                resetarPainel();
             case 1: // "No" option
                 break;
             case 2: // "Cancel" option
                 break;
             default:
         }
    }//GEN-LAST:event_btnExcluirActionPerformed

    private void btnLocalizarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnLocalizarActionPerformed
        Cartao novoCartao;
        CartaoPainel cartaoPainel;

        novoCartao = new Cartao();
        
        CartaoLocalizar localizadorCartao = new CartaoLocalizar(null, true, prova.getCartoes(), novoCartao);
        localizadorCartao.setLocationRelativeTo(this);
        localizadorCartao.pack();
        localizadorCartao.setVisible(true);

        if (novoCartao.getNumeroInscricao() != 0) {
            if (salvarCartaoAtual()) {
                cartaoPainel = new CartaoPainel(novoCartao, prova.getQuantidadeQuestoes(), prova.getTipoProva());
                //cartaoPainel.setPreferredSize(new Dimension(cartaoPainel.getPreferredSize().width, cartaoPainel.getPreferredSize().height));
                cartaoPainel.setEnabled(false);
                btnAlterar.setEnabled(true);
                btnIncluir.setEnabled(true);
                btnExcluir.setEnabled(false);
                painelInternoScroll.removeAll();
                painelInternoScroll.add(cartaoPainel);
                painelInternoScroll.setPreferredSize(cartaoPainel.getPreferredSize());
                painelInternoScroll.validate();
                painelInternoScroll.repaint();
                scrpnlQuestoesCartao.validate();
                scrpnlQuestoesCartao.repaint();
            }
        }
    }//GEN-LAST:event_btnLocalizarActionPerformed

    private void btnCorrigirCartoesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCorrigirCartoesActionPerformed
        if (salvarCartaoAtual()) {
            if (!prova.getCartoes().isEmpty()) {
                prova.corrigirCartoes();
                JOptionPane.showMessageDialog(this, "Todos os cartões da prova \'" + prova.getNome() + "\' foram corrigidos com sucesso.", "Cartões corrigidos!", JOptionPane.INFORMATION_MESSAGE);
            } else {
                JOptionPane.showMessageDialog(this, "A prova não contém nenhum cartão!", "Sem cartões!", JOptionPane.INFORMATION_MESSAGE);
            }
        }

    }//GEN-LAST:event_btnCorrigirCartoesActionPerformed

    private void resetarPainel(){
        if (painelInternoScroll.getComponentCount() != 0) {
            btnExcluir.setEnabled(false);
            btnAlterar.setEnabled(false);
            btnIncluir.setEnabled(true);
            painelInternoScroll.removeAll();
            painelInternoScroll.validate();
            painelInternoScroll.repaint();
            scrpnlQuestoesCartao.validate();
            scrpnlQuestoesCartao.repaint();
        }/*else{
         JOptionPane.showMessageDialog(this, "Nenhum cartão para remover!", "Atenção!", JOptionPane.YES_NO_CANCEL_OPTION);
         }*/
    }
    
    public boolean salvarCartaoAtual() {
        Cartao cartaoAtual;
        int opcao;

        if (painelInternoScroll.getComponentCount() != 0) {
            cartaoAtual = ((CartaoPainel) painelInternoScroll.getComponent(0)).getCartao();
            if (!cartaoAtual.isCartaoSalvo()) {
                if (cartaoAtual.getNumeroInscricao() == 9999990) {
                    opcao = JOptionPane.showConfirmDialog(this, "Deseja salvar o gabarito da prova (" + prova.getNome() + ")?", "Salvar gabarito", JOptionPane.INFORMATION_MESSAGE);
                } else {
                    opcao = JOptionPane.showConfirmDialog(this, "Deseja salvar o cartão (" + cartaoAtual.getNumeroInscricao() + ")?", "Salvar cartão", JOptionPane.INFORMATION_MESSAGE);
                }

                switch (opcao) {
                    case 0: // "Ok" option
                        String questoesFaltando = "";
                        for (int contador = 0; contador < cartaoAtual.getMarcacao().length(); contador++) {
                            if (cartaoAtual.getMarcacao().charAt(contador) == '0') {
                                questoesFaltando += String.format("%02d, ", (contador + 1));
                            }
                        }
                        if (questoesFaltando.isEmpty()) {
                            if (cartaoAtual.getNumeroInscricao() != 9999990) {
                                cartaoAtual.setCartaoSalvo(false);
                                prova.getCartoes().put(cartaoAtual.getNumeroInscricao(), cartaoAtual);
                            } else {
                                cartaoAtual.setCartaoSalvo(true);
                                prova.setGabarito(cartaoAtual.getMarcacao());
                            }
                            prova.setProvaSalva(false);
                            resetarPainel();
                            return true;
                        } else {
                            questoesFaltando = questoesFaltando.substring(0, questoesFaltando.length() - 2);
                            if (questoesFaltando.length() == 2) {
                                JOptionPane.showMessageDialog(this, "A questão " + questoesFaltando + " não teve a resposta informada.", "Questão faltando", JOptionPane.ERROR_MESSAGE);
                            } else {
                                String novaString = "";
                                while (48 < questoesFaltando.length()) {
                                    novaString += questoesFaltando.substring(0, 48) + "\n";
                                    questoesFaltando = questoesFaltando.substring(48);
                                }
                                novaString += questoesFaltando;
                                JOptionPane.showMessageDialog(this, "Algumas questões não tiveram a resposta informada!\nInforme a resposta das questões:\n" + novaString + ".", "Questões faltando", JOptionPane.ERROR_MESSAGE);
                            }
                            return false;
                        }
                    case 1: // "No" option
                        resetarPainel();
                        return true;
                    case 2: // "Cancel" option
                        return false;
                    default:
                        return false;
                }
            } else {
                resetarPainel();
                return true;
            }
        } else {
            return true;
        }
    }

    public void incluirCartao(ActionEvent evt) {
        if (btnIncluir.isEnabled()) {
            btnIncluirActionPerformed(evt);
        } else {
            JOptionPane.showMessageDialog(this, "Não é possível incluir cartões neste momento!", "Erro!", JOptionPane.INFORMATION_MESSAGE);
        }
    }

    public void excluirCartao(ActionEvent evt) {
        if (btnExcluir.isEnabled()) {
            btnExcluirActionPerformed(evt);
        } else {
            JOptionPane.showMessageDialog(this, "Não é possível excluir cartões neste momento!", "Erro!", JOptionPane.INFORMATION_MESSAGE);
        }
    }

    public void alterarCartao(ActionEvent evt) {
        if (btnAlterar.isEnabled()) {
            btnAlterarActionPerformed(evt);
        } else {
            JOptionPane.showMessageDialog(this, "Não é possível alterar cartões neste momento!", "Erro!", JOptionPane.INFORMATION_MESSAGE);
        }
    }

    public void localizarCartao(ActionEvent evt) {
        if (btnLocalizar.isEnabled()) {
            btnLocalizarActionPerformed(evt);
        } else {
            JOptionPane.showMessageDialog(this, "Não é possível localizar cartões neste momento!", "Erro!", JOptionPane.INFORMATION_MESSAGE);
        }
    }

    public void corrigirCartoes(ActionEvent evt) {
        if (btnCorrigirCartoes.isEnabled()) {
            btnCorrigirCartoesActionPerformed(evt);
        } else {
            JOptionPane.showMessageDialog(this, "Não é possível corrigir cartões neste momento!", "Erro!", JOptionPane.INFORMATION_MESSAGE);
        }
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnAlterar;
    private javax.swing.JButton btnCorrigirCartoes;
    private javax.swing.JButton btnExcluir;
    private javax.swing.JButton btnIncluir;
    private javax.swing.JButton btnLocalizar;
    private javax.swing.JPanel painelInternoScroll;
    private javax.swing.JPanel pnlBotoesCartao;
    private javax.swing.JScrollPane scrpnlQuestoesCartao;
    // End of variables declaration//GEN-END:variables
}
